package cn.lxh.blog.controller;


import cn.lxh.blog.domain.Article;
import cn.lxh.blog.dto.ArticleDto;
import cn.lxh.blog.query.ArticleQuery;
import cn.lxh.blog.service.IArticleService;
import cn.lxh.util.JsonResult;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * ArticleController控制器类
 */
@RestController // 该类交给spring管理, 并且返回JSON格式
@RequestMapping("/article") // 默认请求路径
@Api(tags = "文章接口类")
public class ArticleController {

    @Autowired
    private IArticleService articleService;


    /**
     * 根据id判断是添加还是修改
     *
     * @param article
     * @return
     */
    @PutMapping
    @ApiOperation("根据id判断是添加还是修改")
    public JsonResult addOrUpdate(@RequestBody Article article) { // 将前端JSON格式的数据转为Java对象
        try {
            if (article.getId() == null) {
                // 添加文章
                articleService.add(article);
            } else {
                // 修改文章
                articleService.update(article);
            }
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 根据id删除文章
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    @ApiOperation("根据id删除文章")
    public JsonResult delete(@PathVariable("id") Long id) {
        try {
            // 根据id删除文章
            articleService.delete(id);
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 根据id查询单个文章
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询单个文章")
    public Article findOne(@PathVariable("id") Long id) {
        return articleService.findOne(id);
    }

    /**
     * 查询所有文章
     *
     * @return
     */
    @GetMapping
    @ApiOperation("查询所有文章")
    public List<Article> findAll() {
        return articleService.findAll();
    }

    /**
     * 根据id批量删除文章
     *
     * @param ids
     * @return
     */
    @PatchMapping
    @ApiOperation("根据id批量删除文章")
    public JsonResult patchDelete(@RequestBody Long[] ids) {
        try {
            // 根据id批量删除文章
            articleService.patchDelete(ids);
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 分页查询
     *
     * @param articleQuery
     * @return
     */
    @PostMapping
    @ApiOperation("分页查询")
    public PageInfo<Article> queryPage(@RequestBody ArticleQuery articleQuery) {
        return articleService.queryPage(articleQuery);
    }

    /**
     * 查询文章类型的文章数量
     * @return
     */
    @GetMapping("/countByArticleType")
    @ApiOperation("查询文章类型的文章数量")
    public List<ArticleDto> countByArticleType(){
        return articleService.countByArticleType();
    }

    /**
     * 查询文章创建时间的文章数量
     * @return
     */
    @GetMapping("/countByArticleCreateTime")
    @ApiOperation("查询文章创建时间的文章数量")
    public List<ArticleDto> countByArticleCreateTime(){
        return articleService.countByArticleCreateTime();
    }

    /**
     * 查询相关文章
     * @param id
     * @return
     */
    @GetMapping("/getRelatedArticles/{id}")
    public List<Article> getRelatedArticles(@PathVariable("id") Long id){
        return articleService.getRelatedArticles(id);
    }

    /**
     * 根据文章类型id查询文章
     * @param id
     * @return
     */
    @GetMapping("/getArticlesByTypeId/{id}")
    public List<Article> getArticlesByTypeId(@PathVariable("id") Long id){
        return articleService.getArticlesByTypeId(id);
    }

    /**
     * 根据创建时间查询文章集合
     * @param articleCreateTime
     * @return
     */
    @GetMapping("/getArticleByTime/{articleCreateTime}")
    public List<ArticleDto> getArticleByTime(@PathVariable("articleCreateTime") String articleCreateTime){
        return articleService.getArticleByTime(articleCreateTime);
    }

    /**
     * 根据文章点赞获取文章数据
     * @return
     */
    @GetMapping("/articleRanking")
    public List<ArticleDto> articleRanking(){
        return articleService.articleRanking();
    }

    /**
     * 获取文章数量最多的文章类型
     * @return
     */
    @GetMapping("/articleTypeRanking")
    public List<ArticleDto> articleTypeRanking(){
        return articleService.articleTypeRanking();
    }

    /**
     * 阅读量加1
     * @param articleId
     * @return
     */
    @PutMapping ("/addPageView/{articleId}")
    public JsonResult addPageView(@PathVariable("articleId") Long articleId){
        try {
            articleService.addPageView(articleId);
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace();
            return JsonResult.error("网络超时!");
        }
    }

}
